package com.AdvancedDemos.单元测试_反射_注解.注解;

import org.junit.Test;

import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * ③定义TestResolvingMyAnnotation4测试类，解析Demo类中的全部注解
 */
public class testParseMyAnnotation4 {
    /*
    如何解析注解？
    ◉要解析谁上面的注解，就应该先拿到谁
    ◉比如要解析类上面的注解，则应该先获取该类的Class对象，再通过Class对象解析其上面的注解
    ◉比如要解析成员方法上面的注解，则应该获取到该成员方法的Method对象，再通过Method对象解析其上面的注解
    ◉Class、Method、Field、Constructor都实现了AnnotatedElement接口，它们都拥有解析注解的能力
AnnotatedElement接口提供了解析注解的方法             说明
public Annotation[] getDeclaredAnnotation            获取当前对象上面的注解
public T getDeclaredAnnotation(Class<T>  annotationClass)  获取指定的注解对象
public boolean isAnnotationPresent(Class<Annotation> annotationClass) 判断当前对象上面是否存在某个注解
    */

    /**
     * 解析类上的注解
     */
    @Test
    public void parseClass() {
        //1、先得到Class对象
        Class c = UseAnnotation4.class;
        //2、解析类上的注解
        //判断类上是否包含了某个注解
        if (c.isAnnotationPresent(MyAnnotation4.class)) {
            MyAnnotation4 myAnnotation4 = (MyAnnotation4) c.getDeclaredAnnotation(MyAnnotation4.class);
            System.err.println("myAnnotation4.value() = " + myAnnotation4.value());
            System.err.println("myAnnotation4.aaa() = " + myAnnotation4.aaa());
            System.err.println("myAnnotation4.bbb() = " + Arrays.toString(myAnnotation4.bbb()));
            //myAnnotation4.value() = value1
            //myAnnotation4.aaa() = 1.0
            //myAnnotation4.bbb() = [a1, b1, c1]
        }
    }


    /**
     * 解析函数上的注解
     *
     * @throws Exception
     */
    @Test
    public void parseMethod() throws Exception {
        //1、先得到Class对象
        Class c = UseAnnotation4.class;
        //用Class对象得到Method
        Method m = c.getDeclaredMethod("useMyAnnotation4");
        //2、解析函数上的注解
        //判断函数上是否有某个注解
        if (m.isAnnotationPresent(MyAnnotation4.class)) {
            MyAnnotation4 myAnnotation4 = (MyAnnotation4) m.getDeclaredAnnotation(MyAnnotation4.class);
            System.err.println("myAnnotation4.value() = " + myAnnotation4.value());
            System.err.println("myAnnotation4.aaa() = " + myAnnotation4.aaa());
            System.err.println("myAnnotation4.bbb() = " + Arrays.toString(myAnnotation4.bbb()));
            //myAnnotation4.value() = value2
            //myAnnotation4.aaa() = 2.0
            //myAnnotation4.bbb() = [a2, b2, c2]

        }
    }
}
